From Martin. Added detection of Garmin fitness-specific protocols and data types
authorrobertl <robertl>
Sun, 7 Mar 2010 03:51:28 +0000 (03:51 +0000)
committerrobertl <robertl>
Sun, 7 Mar 2010 03:51:28 +0000 (03:51 +0000)
jeeps/gpsapp.c
jeeps/gpsprot.h

index 0aff1580f69aca85e0c259b6637fc12cf4e33836..fac1d68919eeb9143c54b144844335c736fe2d6a 100644 (file)
@@ -5,6 +5,7 @@
 ** @version 1.0
 ** @modified Dec 28 1999 Alan Bleasby. First version
 ** @modified Copyright (C) 2004, 2005, 2006 Robert Lipe
+** @modified Copyright (C) 2007 Achim Schumacher
 ** @@
 **
 ** This library is free software; you can redistribute it and/or
@@ -252,6 +253,8 @@ static int32 GPS_A000(const char *port)
     gps_lap_type                = -1;
     gps_run_transfer            = -1;
     gps_run_type                = -1;
+    gps_run_crs_trk_type        = -1;
+    gps_run_crs_trk_hdr_type    = -1;
     gps_workout_transfer        = -1;
     gps_workout_type            = -1;
     gps_workout_occurrence_type = -1;
@@ -261,10 +264,13 @@ static int32 GPS_A000(const char *port)
     gps_workout_limits_type     = -1;
     gps_course_transfer         = -1;
     gps_course_type             = -1;
+    gps_course_lap_transfer     = -1;
     gps_course_lap_type         = -1;
+    gps_course_point_transfer   = -1;
     gps_course_point_type       = -1;
     gps_course_limits_transfer  = -1;
     gps_course_limits_type      = -1;
+    gps_course_trk_transfer     = -1;
 
     gps_device_command          = -1;
     gps_link_type               = -1;
@@ -414,6 +420,14 @@ static void GPS_A001(GPS_PPacket packet)
                    break;
                case 302:
                    gps_trk_transfer = pA302;
+                   /* Use A302 for course track transfer only if we don't
+                    * have another protocol for it yet. This is in accordance
+                    * with the Garmin docs for A1006 which say to use A302
+                    * in this context only if A1012 is not reported.
+                    */
+                   if (gps_course_trk_transfer == -1) {
+                       gps_course_trk_transfer = pA302;
+                   }
                    break;
                case 400:
                    gps_prx_waypt_transfer = pA400;
@@ -451,9 +465,18 @@ static void GPS_A001(GPS_PPacket packet)
                case 1006:
                    gps_course_transfer = pA1006;
                    break;
+               case 1007:
+                   gps_course_lap_transfer = pA1007;
+                   break;
+               case 1008:
+                   gps_course_point_transfer = pA1008;
+                   break;
                case 1009:
                    gps_course_limits_transfer = pA1009;
                    break;
+               case 1012:
+                   gps_course_trk_transfer = pA1012;
+                   break;
            }
            break;
 
@@ -563,6 +586,18 @@ static void GPS_A001(GPS_PPacket packet)
                            case 312: gps_trk_hdr_type = pD312; break;
                            default:  GPS_Protocol_Error(tag,data); break;
                    }
+                   if (lasta==302 && gps_course_trk_transfer == pA302)
+                       switch (data) {
+                               case 300: gps_run_crs_trk_type = pD300; break;
+                               case 301: gps_run_crs_trk_type = pD301; break;
+                               case 302: gps_run_crs_trk_type = pD302; break;
+                               case 303: gps_run_crs_trk_type = pD303; break;
+                               case 304: gps_run_crs_trk_type = pD304; break;
+                               case 310: gps_run_crs_trk_hdr_type = pD310; break;
+                               case 311: gps_run_crs_trk_hdr_type = pD311; break;
+                               case 312: gps_run_crs_trk_hdr_type = pD312; break;
+                               default:  GPS_Protocol_Error(tag,data); break;
+                       }
                    continue;
            }
 
@@ -719,6 +754,25 @@ static void GPS_A001(GPS_PPacket packet)
                    gps_course_limits_type = pD1013;
                continue;
            }
+           else if (lasta == 1012)
+           {
+               /* We don't know which data types to expect for A1012. For now,
+                * accept the same ones as for A302 since it is used as a
+                * replacement for this.
+                */
+               switch (data) {
+                       case 300: gps_run_crs_trk_type = pD300; break;
+                       case 301: gps_run_crs_trk_type = pD301; break;
+                       case 302: gps_run_crs_trk_type = pD302; break;
+                       case 303: gps_run_crs_trk_type = pD303; break;
+                       case 304: gps_run_crs_trk_type = pD304; break;
+                       case 310: gps_run_crs_trk_hdr_type = pD310; break;
+                       case 311: gps_run_crs_trk_hdr_type = pD311; break;
+                       case 312: gps_run_crs_trk_hdr_type = pD312; break;
+                       default:  GPS_Protocol_Error(tag,data); break;
+               }
+               continue;
+           }
        }
     }
 
index 09df347ebb1524725113c6a423c5451d7e321a0c..95705c90f51145f990f523409c149c940e4a54d0 100644 (file)
@@ -184,8 +184,14 @@ int32 gps_user_profile_transfer;
 int32 gps_workout_limits_transfer;
 #define pA1006 1006
 int32 gps_course_transfer;
+#define pA1007 1007
+int32 gps_course_lap_transfer;
+#define pA1008 1008
+int32 gps_course_point_transfer;
 #define pA1009 1009
 int32 gps_course_limits_transfer;
+#define pA1012 1012
+int32 gps_course_trk_transfer;
 
 /*
  * Waypoint D Type
@@ -241,6 +247,7 @@ int32 gps_rte_link_type;
 #define pD303 303
 #define pD304 304
 int32 gps_trk_type;
+int32 gps_run_crs_trk_type;
 
 
 /*
@@ -250,6 +257,7 @@ int32 gps_trk_type;
 #define pD311 311
 #define pD312 312
 int32 gps_trk_hdr_type;
+int32 gps_run_crs_trk_hdr_type;